Android アプリに Flutter 画面を追加する
このガイドでは、単一の Flutter 画面を 既存の Android アプリ。 Flutter画面は通常追加できますが、 不透明なスクリーン、またはシースルー、半透明のスクリーンとして使用できます。 このガイドでは両方のオプションについて説明します。
通常のFlutter画面を追加する
ステップ 1: FlutterActivity を AndroidManifest.xml に追加する
Flutter が提供するFlutterActivity
flutterを表示するには
Android アプリ内でのエクスペリエンス。他のものと同じようにActivity
、FlutterActivity
に登録する必要がありますAndroidManifest.xml
。次の XML をAndroidManifest.xml
ファイルの下にあるapplication
鬼ごっこ:
<activity
android:name="io.flutter.embedding.android.FlutterActivity"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
/>
への参照@style/LaunchTheme
交換できます
に適用したい Android テーマごとにFlutterActivity
。
テーマの選択により、適用される色が決まります
Android のシステム クロム (Android のナビゲーション バーなど)
の背景色FlutterActivity
直前
Flutter UI が初めてそれ自体をレンダリングします。
ステップ 2: FlutterActivity を起動する
とFlutterActivity
マニフェストファイルに登録されている、
起動するコードを追加するFlutterActivity
どの時点からでも
必要なアプリに追加します。次の例は、FlutterActivity
から発射されるOnClickListener
。
myButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(
FlutterActivity.createDefaultIntent(currentActivity)
);
}
});
myButton.setOnClickListener {
startActivity(
FlutterActivity.createDefaultIntent(this)
)
}
前の例では、Dart エントリポイントが
と呼ばれますmain()
、最初の Flutter ルートは「/」です。
Dart エントリポイントは、を使用して変更することはできませんIntent
、
ただし、最初のルートは次を使用して変更できます。Intent
。
次の例は、FlutterActivity
最初にカスタムをレンダリングする
ルートイン flutter。
myButton.addOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(
FlutterActivity
.withNewEngine()
.initialRoute("/my_route")
.build(currentActivity)
);
}
});
myButton.setOnClickListener {
startActivity(
FlutterActivity
.withNewEngine()
.initialRoute("/my_route")
.build(this)
)
}
交換"/my_route"
希望の初期ルートで。
の使用withNewEngine()
ファクトリーメソッド
を構成しますFlutterActivity
内部的に作成するもの
独自のFlutterEngine
実例。これには、
重要な初期化時間。代替アプローチ
指示することですFlutterActivity
あらかじめ温めたものを使用するには、
キャッシュされたFlutterEngine
、 flutterを最小限に抑えます
初期化時間。そのアプローチについては次に説明します。
ステップ 3: (オプション) キャッシュされた FlutterEngine を使用する
毎日FlutterActivity
独自のものを作成するFlutterEngine
デフォルトでは。各FlutterEngine
自明ではない
ウォームアップタイム。これは、標準を立ち上げることを意味しますFlutterActivity
Flutter の前に短い遅延が発生します
経験が目に見えるようになる。この遅延を最小限に抑えるには、
温めることができますFlutterEngine
に到着する前に
あなたのFlutterActivity
、その後、使用できます
あなたの事前に温めたFlutterEngine
その代わり。
あらかじめ温めておくにはFlutterEngine
、合理的なものを見つけてください
インスタンスを作成するアプリ内の場所FlutterEngine
。
次の例では、任意にFlutterEngine
の中にApplication
クラス:
public class MyApplication extends Application {
public FlutterEngine flutterEngine;
@Override
public void onCreate() {
super.onCreate();
// Instantiate a FlutterEngine.
flutterEngine = new FlutterEngine(this);
// Start executing Dart code to pre-warm the FlutterEngine.
flutterEngine.getDartExecutor().executeDartEntrypoint(
DartEntrypoint.createDefault()
);
// Cache the FlutterEngine to be used by FlutterActivity.
FlutterEngineCache
.getInstance()
.put("my_engine_id", flutterEngine);
}
}
class MyApplication : Application() {
lateinit var flutterEngine : FlutterEngine
override fun onCreate() {
super.onCreate()
// Instantiate a FlutterEngine.
flutterEngine = FlutterEngine(this)
// Start executing Dart code to pre-warm the FlutterEngine.
flutterEngine.dartExecutor.executeDartEntrypoint(
DartExecutor.DartEntrypoint.createDefault()
)
// Cache the FlutterEngine to be used by FlutterActivity.
FlutterEngineCache
.getInstance()
.put("my_engine_id", flutterEngine)
}
}
に渡されたIDは、FlutterEngineCache
何でも構いません。
すべてのユーザーに同じ ID を渡すようにしてください。FlutterActivity
またFlutterFragment
キャッシュされたものを使用する必要がありますFlutterEngine
。
使用するFlutterActivity
キャッシュされたものでFlutterEngine
については次に説明します。
事前にウォームアップされキャッシュされたFlutterEngine
、今必要なのは
あなたに指示するFlutterActivity
キャッシュされたものを使用するには87253c0d-1144-44c9-a1c1-ee965c85fbc新しいものを作成する代わりに。
これを実現するには、次を使用しますFlutterActivity
のwithCachedEngine()
ビルダー:
myButton.addOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(
FlutterActivity
.withCachedEngine("my_engine_id")
.build(currentActivity)
);
}
});
myButton.setOnClickListener {
startActivity(
FlutterActivity
.withCachedEngine("my_engine_id")
.build(this)
)
}
を使用するときは、withCachedEngine()
ファクトリーメソッド、
必要なデータをキャッシュするときに使用したのと同じ ID を渡します。FlutterEngine
。
さて、起動すると、FlutterActivity
、
遅延が大幅に減少します
Flutterコンテンツの表示。
キャッシュされたエンジンを使用した初期ルート
初期ルートの概念は、FlutterActivity
またはFlutterFragment
新しいものでFlutterEngine
。
しかし、FlutterActivity
とFlutterFragment
を提供しないでください
キャッシュされたエンジンを使用する場合の初期ルートの概念。
これは、キャッシュされたエンジンがすでに存在していることが想定されるためです。
Dart コードを実行しているため、設定するには遅すぎることを意味します。
初期ルート。
キャッシュされたエンジンを起動したい開発者
カスタムの初期ルートを使用すると、キャッシュされたルートを設定できますFlutterEngine
直前にカスタムの初期ルートを使用するには
Dart エントリポイントを実行します。次の例
キャッシュされたエンジンでの初期ルートの使用を示します。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// Instantiate a FlutterEngine.
flutterEngine = new FlutterEngine(this);
// Configure an initial route.
flutterEngine.getNavigationChannel().setInitialRoute("your/route/here");
// Start executing Dart code to pre-warm the FlutterEngine.
flutterEngine.getDartExecutor().executeDartEntrypoint(
DartEntrypoint.createDefault()
);
// Cache the FlutterEngine to be used by FlutterActivity or FlutterFragment.
FlutterEngineCache
.getInstance()
.put("my_engine_id", flutterEngine);
}
}
class MyApplication : Application() {
lateinit var flutterEngine : FlutterEngine
override fun onCreate() {
super.onCreate()
// Instantiate a FlutterEngine.
flutterEngine = FlutterEngine(this)
// Configure an initial route.
flutterEngine.navigationChannel.setInitialRoute("your/route/here");
// Start executing Dart code to pre-warm the FlutterEngine.
flutterEngine.dartExecutor.executeDartEntrypoint(
DartExecutor.DartEntrypoint.createDefault()
)
// Cache the FlutterEngine to be used by FlutterActivity or FlutterFragment.
FlutterEngineCache
.getInstance()
.put("my_engine_id", flutterEngine)
}
}
ナビゲーション チャネルの初期ルートを設定すると、関連付けられたFlutterEngine
の最初の実行時に目的のルートを表示します。runApp()
ダーツ機能。
ナビゲーションチャネルの初期ルートプロパティの変更
最初の実行後runApp()
効果はありません。
同じものを使用したい開発者FlutterEngine
異なる間Activity
砂Fragment
とスイッチ
これらのディスプレイ間のルートにはメソッド チャネルを設定する必要があります。
Dart コードに変更を明示的に指示するNavigator
ルート。
半透明の Flutter 画面を追加する
ほとんどのフルスクリーンの Flutter エクスペリエンスは不透明です。
ただし、一部のアプリは Flutter をデプロイしたいと考えています。
たとえば、モーダルのように見える画面
ダイアログまたはボトムシート。 Flutter は半透明をサポートしますFlutterActivity
箱から出してすぐです。
あなたのFlutterActivity
半透明の、
通常のプロセスに次の変更を加えます
の作成と起動dcddf25b-a5c8-422d-8add-2fdde478ed6b。
ステップ 1: 半透明のテーマを使用する
Android には特別なテーマ プロパティが必要ですActivity
レンダリングする
半透明の背景付き。 Android テーマを作成または更新するには、
次のプロパティ:
<style name="MyTheme" parent="@style/MyParentTheme">
<item name="android:windowIsTranslucent">true</item>
</style>
次に、半透明のテーマを適用します。FlutterActivity
。
<activity
android:name="io.flutter.embedding.android.FlutterActivity"
android:theme="@style/MyTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
/>
あなたのFlutterActivity
半透明をサポートするようになりました。
次に、FlutterActivity
明示的な透明性のサポート付き。
ステップ 2: 透明な FlutterActivity を開始する
を起動するには、FlutterActivity
背景が透明の場合、
適切なパスを渡すBackgroundMode
にIntentBuilder
:
// Using a new FlutterEngine.
startActivity(
FlutterActivity
.withNewEngine()
.backgroundMode(FlutterActivityLaunchConfigs.BackgroundMode.transparent)
.build(context)
);
// Using a cached FlutterEngine.
startActivity(
FlutterActivity
.withCachedEngine("my_engine_id")
.backgroundMode(FlutterActivityLaunchConfigs.BackgroundMode.transparent)
.build(context)
);
// Using a new FlutterEngine.
startActivity(
FlutterActivity
.withNewEngine()
.backgroundMode(FlutterActivityLaunchConfigs.BackgroundMode.transparent)
.build(this)
);
// Using a cached FlutterEngine.
startActivity(
FlutterActivity
.withCachedEngine("my_engine_id")
.backgroundMode(FlutterActivityLaunchConfigs.BackgroundMode.transparent)
.build(this)
);
あなたは今、FlutterActivity
透明な背景付き。